package com.ctshk.rpc.custom.service;


import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.custom.dto.insurance.TripScheduleInsuranceDTO;
import com.ctshk.rpc.custom.dto.trip.*;
import com.ctshk.rpc.custom.dto.trip.TripScheduleDetailInfoResp;
import com.ctshk.rpc.custom.req.trip.*;

import java.math.BigDecimal;
import java.util.List;


/**
 * <p>
 * 团期 服务类
 * </p>
 *
 * @author 叶冠峰
 * @since 2021-01-20
 */
public interface ICustomizedTripScheduleService {

    /**
     * 团期列表(产品中心)
     * @param tripScheduleListReq
     * @param currentUser
     * @return
     */
    PageResponse<TripScheduleListDTO> list(TripScheduleListReq tripScheduleListReq, TokenUser currentUser);

    /**
     * 开团基本资料
     * @param tripScheduleInfoReq
     * @return
     */
    Result<TripScheduleBaseInfoDTO> tripScheduleBaseInfo(TripScheduleInfoReq tripScheduleInfoReq);

    /**
     * 团期销售设置信息
     * @param tripScheduleIdReq
     * @return
     */
    Result<TripScheduleSalesSettingInfoDTO> salesSettingInfo(TripScheduleIdReq tripScheduleIdReq);

    /**
     * 保存团期基本信息
     * @param saveTripScheduleBaseInfoReq
     * @param user
     * @return
     */
    Result saveTripScheduleBaseInfo(SaveTripScheduleBaseInfoReq saveTripScheduleBaseInfoReq, TokenUser user);

    /**
     * 保存团期销售设置
     * @param saveTripScheduleSalesSettingReq
     * @param user
     * @return
     */
    Result saveTripScheduleSalesSetting(SaveTripScheduleSalesSettingReq saveTripScheduleSalesSettingReq, TokenUser user);

    /**
     * 团期行程信息
     * @param tripScheduleIdReq
     * @return
     */
    Result<TripScheduleItineraryDTO> tripInfo(TripScheduleIdReq tripScheduleIdReq);

    /**
     * 保存团期行程信息
     * @param seriesTripScheduleItineraryDayReq
     * @param user
     * @return
     */
    Result saveItineraryInfo(SeriesTripScheduleItineraryDayReq seriesTripScheduleItineraryDayReq, TokenUser user);

    /**
     * 团期详情
     * @param tripScheduleDetailInfoReq
     * @param userId
     * @return
     */
    Result<TripScheduleDetailInfoResp> info(TripScheduleDetailInfoReq tripScheduleDetailInfoReq, Long userId);

    /**
     * 定制包团下单信息
     * @param tripScheduleDetailInfoReq
     * @return
     */
    Result<ScheduleOrderPageInfoDTO> createOrderInfo(TripScheduleDetailInfoReq tripScheduleDetailInfoReq);

    /**
     * 定制包团下单
     * @param tripScheduleCreateOrderReq
     * @param userId
     * @return
     */
  //  Result createOrder(TripScheduleCreateOrderReq tripScheduleCreateOrderReq, Long userId);

    /**
     * 根据报价单获取团期销售设置信息
     * @param tripScheduleSalesSettingInfoReq
     * @return
     */
    Result<SalesSettingPackageInfoDTO> salesSettingInfoByQuotation(TripScheduleSalesSettingInfoReq tripScheduleSalesSettingInfoReq);

    /**
     * 团期列表(预订中心)
     * @param tripScheduleCustomizedCenterListReq
     * @param user
     * @return
     */
    PageResponse<TripScheduleListDTO> customizedCenterList(TripScheduleCustomizedCenterListReq tripScheduleCustomizedCenterListReq, TokenUser user);

    /**
     * 通过id获取团期
     * @param scheduleId
     * @return
     */
    CustomizedTripScheduleDTO queryByScheduleId(Long scheduleId);

    /**
     * 查询指定id集团期
     * @param req
     * @return
     */
    List<TripScheduleListDTO> getTripScheduleList(TripScheduleListIdReq req);

    /**
     * 团期详情-基本内容
     * @param req
     * @param userId
     * @return
     */
    Result<TripScheduleBaseInfoDTO> detailBase(TripScheduleDetailInfoReq req, Long userId);

    /**
     * 团期详情-行程安排
     * @param req
     * @return
     */
    Result<TripScheduleItineraryDTO> detailTrip(TripScheduleDetailInfoReq req);

    /**
     * 团期详情-檔案總管理
     * @param req
     * @return
     */
    Result<List<ArchivesJson>> detailArchives(TripScheduleDetailInfoReq req);

    /**
     * 添加旅客时获取团期信息
     * @param scheduleId
     * @param touristTypeId
     * @return
     */
    AddTouristTripScheduleDTO getAddTouristTripSchedule(Long scheduleId,Long touristTypeId);

    /**
     * 获取团期旅客类型信息
     * @param scheduleId
     * @param touristTypeId
     * @return
     */
    TripScheduleTouristDTO getTripScheduleTourist(Long scheduleId,Long touristTypeId);

    /**
     * 操作订单-调整项目列表
     * @param req
     * @return
     */
    Result<TripScheduleAdjustProjectDTO> adjustProjectList(TripScheduleAdjustProjectListReq req);

    /**
     * 团期保险列表
     * @param scheduleId
     * @return
     */
    List<TripScheduleInsuranceDTO> getInsuranceList(Long scheduleId);

    /**
     * 团期操作
     * @param req
     * @return
     */
    Result operateTrip(TripScheduleOperateReq req, TokenUser currentUser);

    /**
     * 财务中心-特殊收款-根据ID获取团期详情（内部接口）
     * @param id
     * @return
     */
    TripScheduleDTO queryById(Long id);

    /**
     * 根据ID列表获取团期详情列表（内部接口）
     * @param idList
     * @param departType 出境类型(3 出境定制 4 入境定制 5 会议会奖)
     * @return
     */
    List<TripScheduleDTO> queryByIds(List<Long> idList,Integer departType);

    /**
     * 定制包团列表(其他模块调用)
     * @param req
     * @return
     */
    PageResponse<TripScheduleDTO> scheduleList(ScheduleListReq req);

    /**
     * 完团审批
     * @param req
     * @return
     */
    Result approval(TripScheduleApprovalReq req);

    /**
     * 旅客名单-团期信息
     * @param scheduleId
     * @return
     */
    Result<TouristScheduleInfoDTO> touristScheduleInfo(Long scheduleId);

    /**
     * 团期操作-茶会通知
     * @param req
     * @param currentUser
     * @return
     */
    Result teaPartyNotice(TripScheduleTeaPartyNoticeReq req, TokenUser currentUser);

    /**
     * 团期操作-财务锁定状态修改
     * @param req
     * @param userId
     * @return
     */
    Result lockStatus(TripScheduleAdjustProjectListReq req, Long userId);

    /**
     * 查询团期状态（内部接口）
     * @param idList
     * @return
     */
    List<TripScheduleGuideDTO> getScheduleList(List<Long> idList);

    /**
     * 根据团号获取团期ID
     * @param tripNumber
     * @return
     */
    Long queryIdByTripNumber(String tripNumber);

    /**
     * 获取团期加幅后团费（内部接口）
     * @param groupFee
     * @param scheduleId
     * @param userId
     * @return
     */
    BigDecimal getScheduleAddAmount(BigDecimal groupFee,Long scheduleId,Long userId);

    /**
     * 操作订单-调整项目列表
     * @param req
     * @return
     */
   // Result adjustProjectList(TripScheduleDetailInfoReq req);
}
